💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지,웹·앱 개발의 모든것을 담아낸 강의와 개발 노트

    16 django filter와 DRF를 이용한 API 필터링 | ✅ 편저: 코담 운영자

    16-django-filter와 DRF를 이용한 API 필터링

    - django-filter와 DRF를 이용한 API 필터링

    🔗 소스 1: bugbytes-io/drf-course-api

    🔗 소스 2: braverokmc79/Django_REST_Framework_Series


    1. 개요

    이번 강의에서는 Django REST Framework(DRF)에서 django-filter 패키지를 활용해 API 응답 데이터를 필터링하는 방법을 배웁니다. 대량의 데이터를 클라이언트가 직접 걸러내는 대신, 서버에서 원하는 조건의 데이터만 응답해주는 방식으로 API 성능을 높이고, 사용 편의성을 개선할 수 있습니다.


    2. 기본 필터링 기능

    • API에서 기본적으로 전체 데이터를 반환하는 것이 일반적이지만, 클라이언트가 필요한 일부 데이터만 조회할 수 있도록 필터 기능이 필요합니다.
    • 예: 가격이 특정 값 이상/이하인 상품만 조회, 이름에 특정 단어가 포함된 상품만 필터링

    3. django-filter 설치 및 설정

    pip install django-filter
    

    settings.py 설정:

    INSTALLED_APPS = [
        ...
        'django_filters',
    ]
    
    REST_FRAMEWORK = {
    
      ...
    
      'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
    }
    

    예 - 자동 필터 처리

    
    class ProductViewSet(viewsets.ModelViewSet):
        queryset = Product.objects.all()
        serializer_class = ProductSerializer
        filterset_fields = ['category', 'price']
    ---
    /api/products/?category=book
    /api/products/?price=5000
    
    

    📝 정리

    설정 항목 설명
    'DEFAULT_FILTER_BACKENDS' 필터 처리를 어떤 방식으로 할지 정하는 설정
    'django_filters.rest_framework.DjangoFilterBackend' django-filter를 사용한 강력하고 직관적인 필터링 지원

    4. View에 filterset 설정 (기초형)

    class ProductListCreateAPIView(generics.ListCreateAPIView):
        queryset = Product.objects.all()
        serializer_class = ProductSerializer
        filterset_fields = ('name', 'price')
    
    • 기본은 exact 조건으로만 필터링됨
    • 예: GET /products/?name=TV 또는 ?price=300.00

    5. 고급 필터링: FilterSet 클래스 사용

    filters.py 파일 생성 후 아래처럼 작성:

    import django_filters
    from api.models import Product
    
    class ProductFilter(django_filters.FilterSet):
        class Meta:
            model = Product
            fields = {
                'name': ['exact', 'icontains'],
                'price': ['exact', 'lt', 'gt', 'range'],
            }
    
    • exact: 정확히 일치
    • icontains: 대소문자 구분 없이 포함
    • lt, gt: 작다/크다
    • range: 범위 조회 (예: ?price__range=100,500)

    View에서 설정:

    from api.filters import ProductFilter
    
    
    class ProductListCreateAPIView(generics.ListCreateAPIView):
        queryset = Product.objects.all()
        serializer_class = ProductSerializer
        #filterset_fields = ('name', 'price')
        filterset_class = ProductFilter
    
        def get_permissions(self):
            self.permission_classes = [AllowAny]
            if self.request.method == 'POST':
                self.permission_classes = [IsAdminUser]
            return super().get_permissions()
    
    

    6. 다양한 필터 예시 (쿼리 파라미터)

    /products/?name__icontains=tv
    /products/?price__gt=100
    /products/?price__lt=500
    /products/?price__range=100,300
    

    7. 필터링의 이점

    • 클라이언트 불필요한 데이터 처리 감소
    • 네트워크 트래픽 감소
    • 서버 응답 시간 단축

    8. 정리

    • django-filter를 통해 DRF에서 손쉽게 필터링 기능을 추가할 수 있음
    • 간단한 필터링은 filterset_fields, 고급 필터링은 FilterSet 클래스 활용
    • API 응답 최적화 및 사용자 편의성 향상에 매우 효과적

    다음 강의에서는 DRF의 검색(SearchFilter)과 정렬(OrderingFilter) 기능을 활용하는 방법을 알아봅니다.

    TOP
    preload preload